home *** CD-ROM | disk | FTP | other *** search
/ Aminet 21 / Aminet 21 (1997)(GTI - Schatztruhe)[!][Oct 1997].iso / Aminet / gfx / show / gs503_data.lha / Ghostscript / data / gs_pdfwr.ps < prev    next >
Text File  |  1997-08-14  |  11KB  |  364 lines

  1. %    Copyright (C) 1996, 1997 Aladdin Enterprises.  All rights reserved.
  2. %
  3. % This file is part of Aladdin Ghostscript.
  4. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  5. % or distributor accepts any responsibility for the consequences of using it,
  6. % or for whether it serves any particular purpose or works at all, unless he
  7. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  8. % License (the "License") for full details.
  9. % Every copy of Aladdin Ghostscript must include a copy of the License,
  10. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  11. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  12. % under certain conditions described in the License.  Among other things, the
  13. % License requires that the copyright notice and this notice be preserved on
  14. % all copies.
  15.  
  16. % gs_pdfwr.ps
  17. % PDF writer additions to systemdict.
  18.  
  19. % This file should be included iff the pdfwrite "device" is included
  20. % in the executable.
  21.  
  22. % Redefine pdfmark to pass the data to the driver.
  23. % We use a pseudo-parameter named /pdfmark whose value is an array:
  24. %    key1 value1 ... CTM /type
  25. /.pdf===dict mark
  26.   /arraytype
  27.    { dup xcheck { ({) (}) } { ([) (]) } ifelse
  28.         % Stack: file obj left right
  29.       4 1 roll 2 index exch writestring () exch
  30.        { exch 2 index exch writestring
  31.      1 index exch pdfmark===only ( )
  32.        }
  33.       forall pop exch writestring
  34.    } bind
  35.   /packedarraytype 1 index
  36.   /dicttype
  37.    { 1 index (<<\n) writestring
  38.       { 2 index 3 -1 roll pdfmark===only 1 index ( ) writestring
  39.     1 index exch pdfmark===only dup (\n) writestring
  40.       }
  41.      forall (>>) writestring
  42.    } bind
  43. .dicttomark readonly def
  44. /pdfmark===only        % <file> <obj> pdfmark===only -
  45.  { .pdf===dict 1 index type .knownget { exec } { write==only } ifelse
  46.  } bind def
  47. /.pdfcvs        % <obj> .pdfcvs <string>
  48.  {        % We can't handle long values yet.
  49.    =string /NullEncode filter dup 2 index pdfmark===only
  50.    dup (\n\000) writestring closefile pop
  51.    =string (\n\000) search
  52.     { dup length string copy exch pop exch pop }
  53.     {        % The converted representation didn't fit.  Punt.
  54.       pop (???)
  55.     }
  56.    ifelse
  57.  } bind def
  58. /.pdfputparams        % <paramarray> <paramname> .pdfputparams <result...>
  59.  { currentdevice null false mark 6 -2 roll exch
  60.         % Don't allow the page device to get cleared....
  61.      {.putdeviceparams} 0 get .currentpagedevice pop {.setpagedevice} 0 get
  62.    3 array astore cvx exec
  63.  } bind def
  64. /pdfmark        % -mark- <key> <value> ... <markname> pdfmark -
  65.  { counttomark 1 add copy
  66.    matrix currentmatrix .pdfcvs exch ]
  67.    1 2 2 index length 3 sub { 2 copy 2 copy get .pdfcvs put pop } for
  68.    /pdfmark .pdfputparams
  69.    type /booleantype ne { cleartomark } if cleartomark
  70.  } odef
  71. userdict /pdfmark .undef
  72.  
  73. % Define setdistillerparams / currentdistillerparams.
  74. % Distiller parameters are currently treated as device parameters.
  75. /.distillerparamkeys mark
  76.         % General parameters
  77.   /ASCII85EncodePages { }
  78.   /AutoRotatePages { }
  79.   /CompatibilityLevel { }
  80.   /CompressPages { }
  81.   /CoreDistVersion { }
  82.   /DoThumbnails { }
  83.   /ImageMemory { }
  84.   /LZWEncodePages { }
  85.   /PreserveHalftoneInfo { }
  86.   /PreserveOPIComments { }
  87.   /PreserveOverprintSettings { }
  88.   /TransferFunctionInfo { }
  89.   /UCRandBGInfo { }
  90.   /UseFlateCompression { }
  91.         % Color sampled image parameters
  92.   /ColorACSDict { }
  93.   /AntiAliasColorImages { }
  94.   /AutoFilterColorImages { }
  95.   /ColorImageDepth { }
  96.   /ColorImageDict { }
  97.   /DownsampleColorImages { }
  98.   /ColorImageDownsampleType { }
  99.   /EncodeColorImages { }
  100.   /ColorImageFilter { }
  101.   /ColorImageResolution { }
  102.   /ColorConversionStrategy { }
  103.   /ConvertCMYKImagesToRGB { }
  104.   /ConvertImagesToIndexed { }
  105.         % Grayscale sampled image parameters
  106.   /GrayACSDict { }
  107.   /AntiAliasGrayImages { }
  108.   /AutoFilterGrayImages { }
  109.   /GrayImageDepth { }
  110.   /GrayImageDict { }
  111.   /DownsampleGrayImages { }
  112.   /GrayImageDownsampleType { }
  113.   /EncodeGrayImages { }
  114.   /GrayImageFilter { }
  115.   /GrayImageResolution { }
  116.         % Monochrome sampled image parameters
  117.   /AntiAliasMonoImages { }
  118.   /MonoImageDepth { }
  119.   /MonoImageDict { }
  120.   /DownsampleMonoImages { }
  121.   /MonoImageDownsampleType { }
  122.   /EncodeMonoImages { }
  123.   /MonoImageFilter { }
  124.   /MonoImageResolution { }
  125.         % Font embedding parameters
  126.   /AlwaysEmbed
  127.    { dup length 0 gt
  128.       { dup 0 get false eq
  129.          { dup length 1 sub 1 exch getinterval exch pop /~AlwaysEmbed exch
  130.          } if
  131.       } if
  132.    }
  133.   /NeverEmbed
  134.    { dup length 0 gt
  135.       { dup 0 get false eq
  136.          { dup length 1 sub 1 exch getinterval exch pop /~NeverEmbed exch
  137.          } if
  138.       } if
  139.    }
  140.   /EmbedAllFonts { }
  141.   /SubsetFonts { }
  142.   /MaxSubsetPct { }
  143. .dicttomark readonly def
  144. /.distillerdevice
  145.  { currentdevice .devicename /pdfwrite eq
  146.     { currentdevice }
  147.     { /pdfwrite finddevice }
  148.    ifelse
  149.  } bind def
  150. /setdistillerparams        % <dict> setdistillerparams -
  151.  { .distillerdevice null false mark 4 index
  152.     { //.distillerparamkeys 2 index .knownget { exec } { pop pop } ifelse }
  153.    forall .putdeviceparams
  154.    type /booleantype eq { pop } { cleartomark pop pop pop } ifelse pop
  155.  } odef
  156. /currentdistillerparams        % - currentdistillerparams <dict>
  157.  { .distillerdevice //.distillerparamkeys .getdeviceparams .dicttomark
  158.  } odef
  159.  
  160. % Patch the 'show' operators to pass the data to the device.
  161. % We use a pseudo-parameter named /show whose value is a dictionary:
  162. %    /String (str)
  163. %    /Values [cx cy char ax ay px py]
  164. %    /Matrix [xx xy yx yy tx ty]
  165. %    /FontName /fontname
  166. %    /Encoding [e0 .. e255]
  167. %    /BaseEncoding [e0 ... e255]
  168. % Note that the cx/y and ax/y values are in text space, not user space.
  169. % We also fill an empty path in order to get the clipping region and
  170. % current color set properly.  THIS IS A BIG HACK.
  171. /.pdfknownfonts mark
  172.   /Courier null
  173.   /Courier-Bold null
  174.   /Courier-Oblique null
  175.   /Courier-BoldOblique null
  176.   /Helvetica null
  177.   /Helvetica-Bold null
  178.   /Helvetica-Oblique null
  179.   /Helvetica-BoldOblique null
  180.   /Symbol null
  181.   /Times-Roman null
  182.   /Times-Bold null
  183.   /Times-Italic null
  184.   /Times-BoldItalic null
  185.   /ZapfDingbats null
  186. .dicttomark readonly def
  187. .currentglobal false .setglobal
  188. /.pdfknownids 50 dict def
  189. .setglobal
  190. /.findorigfont {    % <font> .findorigfont <origfont>
  191.             % Check for a known font with the same name,
  192.             % or one of the 14 known names,
  193.             % and the same UniqueID.
  194.   dup /UniqueID .knownget {
  195.     .pdfknownids 1 index .knownget {
  196.       exch pop dup null ne { true } { pop false } ifelse
  197.     } {            % We haven't looked up the UniqueID yet.
  198.             % Register the UniqueIDs of all fonts.
  199.       .FontDirectory {
  200.     exch pop dup /UniqueID .knownget {
  201.             % Stack: font uniqueid somefont somefontid
  202.       exch .pdfknownids 3 1 roll put
  203.     } {
  204.       pop
  205.     } ifelse
  206.       } forall
  207.             % Register the UniqueIDs of the 14 built-in fonts,
  208.             % to make sure they override any other fonts
  209.             % with the same UniqueIDs.
  210.       .pdfknownfonts {
  211.     pop .FontDirectory 1 index .knownget {
  212.             % Stack: font uniqueid knownname knownfont
  213.       dup /UniqueID get exch .pdfknownids 3 1 roll put
  214.     } if pop
  215.       } forall
  216.             % Now see if the UniqueID is known.
  217.       .pdfknownids 1 index .knownget {
  218.     exch pop true
  219.       } {            % Record the UniqueID as not registered.
  220.     .pdfknownids exch null put false
  221.       } ifelse
  222.     } ifelse
  223.   } {            % This font has no UniqueID.
  224.     false
  225.   } ifelse
  226.             % Stack: font knownfont -true- | font -false-
  227.   {
  228.     exch pop
  229.   } {
  230.     { dup /OrigFont .knownget not { exit } if exch pop } loop
  231.   } ifelse
  232. } .bind def
  233. /setvmthreshold where { pop 1000000 setvmthreshold } if
  234. /.pdfdoshow        % <string> <cxd> <cyd> <char> <axd> <ayd> .pdfdoshow
  235.             %   <bool>
  236.  { mark /String 8 2 roll
  237. %vmstatus pop =only pop (, ) print
  238.    currentpoint transform 7 array astore /Values exch
  239.    currentfont .findorigfont
  240.         % Pass the original font name.
  241.    dup /FontName get
  242.    /FontName exch 3 -1 roll
  243.         % Concatenate the "quotient" of the current FontMatrix
  244.         % and the FontMatrix of the original font.
  245.         % Be sure to include any translation.
  246.    /Matrix
  247.      exch /FontMatrix get matrix invertmatrix
  248.      currentfont /FontMatrix get 1 index concatmatrix
  249.     % The matrix on the stack is now the font scaling matrix.
  250.     % Use it to inverse-transform cx/y and ax/y, so they will be in
  251.     % text space.
  252.     % Stack: mark /String <string> /Values <values> /FontName <fontname>
  253.     %   /Matrix <matrix>
  254.      4 index aload
  255.     %   ... cx cy char ax ay px py values
  256.      8 -2 roll 8 index idtransform 8 2 roll
  257.      5 -2 roll 8 index idtransform 5 2 roll
  258.      astore pop
  259.     % Now construct the combined matrix.
  260.      matrix currentmatrix dup 4 0 put dup 5 0 put dup concatmatrix
  261.    /Encoding currentfont /Encoding .knownget not { [] } if
  262.     % Make a reasonable guess at the base encoding.
  263.    /BaseEncoding StandardEncoding
  264. %vmstatus pop =only pop (, ) print
  265.    .dicttomark
  266.         % Set the clipping region and color in the output.
  267.         % This is another hack!
  268.    gsave newpath fill grestore
  269. %vmstatus pop =only pop (, ) print
  270.    /show .pdfputparams
  271. %vmstatus pop =only pop () = flush
  272.    dup type /booleantype eq
  273.     { pop pop true }
  274.     { dup /undefined eq
  275.        { cleartomark pop pop pop false }
  276.        { dup mark eq { /unknown /rangecheck } if
  277.      counttomark 4 add 1 roll cleartomark pop pop pop
  278.      /.pdfshow cvx exch signalerror
  279.        }
  280.       ifelse
  281.     }
  282.    ifelse
  283.  } .bind def
  284. /.pdfexecshow        % <proc> .pdfexecshow -
  285.  { matrix currentmatrix gsave nulldevice setmatrix
  286.    exec currentpoint grestore moveto
  287.  } .bind def
  288. /.pdfwrite?        % - .pdfwrite? <bool>
  289.  { currentdevice .devicename /pdfwrite eq
  290.    currentfont /FontType get 1 eq and
  291.  } .bind def
  292. % .pdfshow isn't an operator per se, but it still needs to be careful with
  293. % the stack so that the operators will have stack protection.
  294. /.pdfshow        % <string> <cx> <cy> <char> <ax> <ay> <showproc>
  295.             %   .pdfshow -
  296.  { 7 1 roll .pdfwrite?
  297.     { .pdfdoshow }
  298.     { 6 { pop } repeat false }
  299.    ifelse
  300.     { .pdfexecshow }
  301.     { exec }
  302.    ifelse
  303.  } .bind def
  304. /show
  305.  { dup 0 0 32 0 0 { show } .pdfshow
  306.  } .bind odef
  307. /ashow
  308.  { dup 0 0 32 6 index 6 index { ashow } .pdfshow
  309.  } .bind odef
  310. /widthshow
  311.  { 4 copy 4 1 roll 0 0 { widthshow } .pdfshow
  312.  } .bind odef
  313. /awidthshow
  314.  { 6 copy 6 1 roll { awidthshow } .pdfshow
  315.  } .bind odef
  316. /glyphshow where { pop } { (%END) .skipeof } ifelse
  317. /glyphshow
  318.  { .pdfwrite?
  319.     { currentfont /Encoding .knownget not { {} } if
  320.       0 1 2 index length 1 sub
  321.        {        % Stack: glyph encoding index
  322.      2 copy get 3 index eq { exch pop exch pop null exit } if pop
  323.        }
  324.       for null eq
  325.        { (X) dup 0 3 index put show pop }
  326.        { glyphshow }
  327.       ifelse
  328.     }
  329.     { glyphshow
  330.     }
  331.    ifelse
  332.  } .bind odef
  333. %END
  334. /.kshow1 {    % <index> <proc> <string> .kshow1
  335.   (X) dup 0 3 index 6 index get put show
  336.   2 index 1 index length 1 sub lt {
  337.     dup 3 index get exch 4 -1 roll 1 add get
  338.     3 -1 roll exec
  339.   } {
  340.     pop pop pop
  341.   } ifelse
  342. } .bind def
  343. /kshow {
  344.   .pdfwrite? {
  345.         % Construct a closure, and work character by character.
  346.     0 1 2 index length 1 sub 5 -2 roll
  347.     //.kshow1 /exec cvx 4 packedarray cvx for
  348.   } {
  349.     kshow
  350.   } ifelse
  351. } .bind odef
  352. % The remaining operators aren't implemented correctly.
  353. /xshow where {
  354.  pop /xshow { .pdfwrite? { 1 index show pop pop } { xshow } ifelse } .bind odef
  355. } if
  356. /yshow where {
  357.  pop /yshow { .pdfwrite? { 1 index show pop pop } { yshow } ifelse } .bind odef
  358. } if
  359. /xyshow where {
  360.  pop /xyshow { .pdfwrite? { 1 index show pop pop } { xyshow } ifelse } .bind odef
  361. } if
  362.